package com.sh.data.engine.common.enumDefinition;

import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.List;

/**
 * 数据源类型
 *
 * @author: mengzheng.mhc
 * @date: 2024/5/30 10:47
 */
public enum DSType {

    MySQL,
    SQLServer,
    PostgreSQL,
    MatrixDB,
    DB2,
    Oracle,
    Hive,
    Sap,
    HDFS,
    OpenTSDB,
    Kafka,
    MQTT,
    MaxCompute,
    Mongodb,
    Text,
    Dgraph,
    FTP,
    SFTP,
    Redis,
    ElasticSearch,
    HBase,
    DM,
    KINGBASE8,
    File,
    ClickHouse,
    EsSQL,
    TiDB,
    IoTDB,
    InfluxDB;

    private static final List<DSType> RDBMS_TYPES = Arrays.asList(
            MySQL, SQLServer, PostgreSQL, MatrixDB, DB2, Oracle, Sap, DM, KINGBASE8, TiDB);

    private static final List<DSType> SCHEMA_TYPES = Arrays.asList(
            SQLServer, PostgreSQL, MatrixDB, DB2, Oracle, Sap, DM, KINGBASE8);

    private static final List<DSType> FTP_TYPES = Arrays.asList(FTP, SFTP);

    /**
     * 判断是否是关系型类型的数据源
     *
     * @param dsType 数据源类型名称
     * @return 是否是关系型类型的数据源
     */
    public static boolean isRdbms(String dsType) {
        if (StringUtils.isBlank(dsType)) {
            return false;
        }

        return RDBMS_TYPES.stream()
                .anyMatch(rdbmsType -> rdbmsType.name().equalsIgnoreCase(dsType));
    }

    /**
     * 判断是否有schema支持的数据源
     *
     * @param dsType 数据源类型名称
     * @return 是否有schema支持的数据源
     */
    public static boolean hasSchema(String dsType) {
        if (StringUtils.isBlank(dsType)) {
            return false;
        }

        return SCHEMA_TYPES.stream()
                .anyMatch(schemaType -> schemaType.name().equalsIgnoreCase(dsType));
    }

    /**
     * 是否是FTP类的数据源
     *
     * @param dsType 数据源类型名称
     * @return 是否是FTP类的数据源
     */
    public static boolean isFtp(String dsType) {
        if (StringUtils.isBlank(dsType)) {
            return false;
        }

        return FTP_TYPES.stream()
                .anyMatch(ftpType -> ftpType.name().equalsIgnoreCase(dsType));
    }

    /**
     * 获取所有支持的关系型数据源
     *
     * @return 所有支持的关系型数据源的名称
     */
    public static List<String> getAllRdbmsDsType() {
        return RDBMS_TYPES.stream()
                .map(Enum::name)
                .toList();
    }

    public static boolean isValidDSType(String dsType) {
        return Arrays.stream(DSType.values())
                .anyMatch(value -> StringUtils.equalsIgnoreCase(value.name(), dsType));
    }

    /**
     * 根据数据源类型名称获取对应的枚举
     *
     * @param dsType 数据源类型名称
     * @return 数据源类型对应的枚举
     */
    public static DSType from(String dsType) {
        return Arrays.stream(DSType.values())
                .filter(value -> StringUtils.equalsIgnoreCase(value.name(), dsType))
                .findFirst()
                .orElse(null);
    }
}
